///////////// vars ///////////////////
unsigned long dz_previous_time;
unsigned long dz_out=0;
int dz_position=0;
int dz_count=0;

int anzahl=16;
int anzahl_shift=log(anzahl)/log(2);
///////////// vars ///////////////////
void dz_counter(){
  if(digitalRead(2)==1){
    dz_count++;
    if(dz_count==(anzahl-1)){
      dz_count=0; 
      dz_calc();
    }; 
  };
};

void dz_calc() {
  unsigned long dz_now=millis();
  unsigned long temp_dz=(60000/(dz_now-dz_previous_time))<<anzahl_shift; // Drehzahl berechnet
  
  if((dz_now-dz_previous_time)<(4*anzahl) || ((temp_dz>2*dz_out_disp)&&(dz_out_disp>2000 ))){ // wenn man über 15000 U/min => Abstand von 2 Zündungen = 60000[ms/min]/15000[U/min] = 4 [ms/U]  oder eine verdopplung der Drehzahl binnen einer Zündung hat
    temp_dz=dz_out; // alten Wert halten
  };
  dz_previous_time=dz_now;
  dz_out=temp_dz;
};

void dz_copy(){
  if((millis() - dz_previous_time>1000)){ // sollte in dz_out noch das gleiche wie vor 1 sek stehen => motor steht
    dz_out_disp=0;
    dz_out_calc=0;
    //dz_out_disp=floor((millis()%37500)/25);
    dz_ps=0;
  } else { // values valid
    // copy value to _disp
    dz_out_calc=dz_out;
    dz_out_disp=50*round(dz_out/50); // auf 25er Runden
    // ab hier ps Berechnung
    if(dz_out<4000){
      dz_ps=round(dz_out*75/10000);
    } else if(dz_out<9221){
      dz_ps=round(dz_out*115/10000-16);
    } else {
      dz_ps=round(dz_out*23/10000+69);
    };
  };
};
  
void dz_init() {
  attachInterrupt(0, dz_counter, RISING ); // interrupt handler für signalwechsel 0=DigiPin 2
  dz_previous_time=millis();
  Serial.println("DZ init done");
};
